package com.myaihui.service.impl;

import com.myaihui.domain.Case;
import com.myaihui.foundation.model.Pager;
import com.myaihui.foundation.query.ReportQuery;
import com.myaihui.repository.CaseRepository;
import com.myaihui.service.FileService;
import com.myaihui.service.ReportService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * Created by sun on 2018/6/13.
 *
 * @author sunfuchang03@126.com
 * @version 1.0
 * @since 1.0
 */
@Service
public class ReportServiceImpl implements ReportService {
    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Static fields/constants/initializer
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    private static Logger log = LoggerFactory.getLogger(ReportServiceImpl.class);

    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Instance fields
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    @Autowired
    private CaseRepository caseRepository;
    @Autowired
    private FileService fileService;

    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Constructors
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */



    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Public Methods
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    @Override
    public Case get(String id) {
        Assert.hasLength(id, "id must not be null.");
        return caseRepository.findOne(id);
    }

    @Override
    public Pager<Case> pageQuery(ReportQuery query) {
        String platformId = query.getPlatformId();
        int platformType = query.getPlatformType();
        String title = query.getTitle();
        Date startTime = query.getStartTime();
        Date endTime = query.getEndTime();
        Integer state = query.getState();
        Specification<Case> specification = (root, cq, cb) -> {
            if (StringUtils.hasLength(platformId) && platformType > 0) {
                cq.where(
                        cb.and(cb.equal(root.get("platformType"), platformType)),
                        cb.and(cb.equal(root.get("platformId"), platformId))
                );
            }
            if (StringUtils.hasLength(title)) {
                cq.where(cb.and(cb.like(root.get("title"), '%' + title + '%')));
            }
            if (state != null) {
                cq.where(cb.and(cb.equal(root.get("state"), state)));
            }
            if (startTime != null) {
                cq.where(cb.and(cb.greaterThanOrEqualTo(root.get("created"), startTime)));
            }
            if (endTime != null) {
                cq.where(cb.and(cb.lessThanOrEqualTo(root.get("created"), endTime)));
            }
            cq.orderBy(cb.desc(root.get("created")));
            return cq.getRestriction();
        };
        Pageable pageable = new PageRequest(query.getiDisplayStart(), query.getiDisplayLength());
        Page<Case> page = caseRepository.findAll(specification, pageable);
        return new Pager<>(page, query.getsEcho(), page.getContent());

    }

    @Override
    public void delete(String id) {
        Assert.hasLength(id, "id must not be null.");
        Case cs = caseRepository.findOne(id);
        if (cs != null) {
            String imageId = cs.getImageIds();
            if (StringUtils.hasLength(imageId)) {
                String[] imgIds = imageId.split(",");
                for (String imgId : imgIds) {
                    fileService.delete(imgId);
                }
            }
            caseRepository.delete(id);
        }
    }

    @Override
    public void update(Case cs) {
        Assert.notNull(cs, "case must not be null");
        Assert.hasLength(cs.getId(), "case id must not be null");
        caseRepository.save(cs);
    }
    
    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Private Methods
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */


}